package co.gov.medellin.ssti.sub.model.service;

import java.util.Collection;
import java.util.List;

import co.gov.medellin.ssti.sub.model.vo.BeneficioOtorgadoEmpresaVO;
import co.gov.medellin.ssti.sub.model.vo.BeneficioOtorgadoVO;
import co.gov.medellin.ssti.sub.model.vo.BeneficioVO;
import co.gov.medellin.ssti.sub.model.vo.CondicionConsultaVO;
import co.gov.medellin.ssti.sub.model.vo.EmpresaVO;
import co.gov.medellin.ssti.sub.model.vo.ProgramaVO;
import co.gov.medellin.ssti.sub.model.vo.RepAtributoVO;
import co.gov.medellin.ssti.sub.model.vo.RepEmpresaVO;
import co.gov.medellin.ssti.sub.model.vo.ReportComunaVO;
import co.gov.medellin.ssti.sub.model.vo.ReporteTotalComunaVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;

public interface EmpresaService {

	Collection<EmpresaVO> findAllEmpresas();

	/**
	 * Metodo que consulta empresas segun criterio de busqueda (nit,
	 * razonSocial..)
	 * 
	 * @param criteria
	 *            EmpresaVO objeto con los valores de busqueda.
	 * @return Collection de EmpresaVO que cumplan con los criterios de
	 *         busqueda, o Collection vacia.
	 */
	Collection<EmpresaVO> findEmpresaByCriteria(EmpresaVO criteria);

	/**
	 * 
	 * @param codigo
	 * @return
	 */
	EmpresaVO findEmpresaByCodigo(long codigo);

	/**
	 * 
	 * @param empresa
	 * @return
	 */
	int actualizarEmpresa(EmpresaVO empresa);

	/**
	 * 
	 * @param empresa
	 * @return
	 */
	int ingresarEmpresa(EmpresaVO empresa);

	/**
	 * 
	 * @param criteria
	 * @return
	 */
	Collection<BeneficioOtorgadoVO> findBeneficios(EmpresaVO criteria);

	/**
	 * 
	 * @param codigoEmpresa
	 * @return
	 */
	Collection<BeneficioOtorgadoEmpresaVO> findUltimosBeneficios(
			Long codigoEmpresa);

	/**
	 * 
	 * @param codigoBeneficio
	 * @param codigoEmpresa
	 * @return
	 */
	Collection<BeneficioVO> findDetalleBeneficios(Long codigoBeneficio,
			Long codigoEmpresa);

	/**
	 * 
	 * @param criteria
	 * @param filtros
	 * @return
	 */
	Collection<BeneficioOtorgadoEmpresaVO> findReporteDetalladoBeneficios(
			RepEmpresaVO criteria, List<CondicionConsultaVO> filtros);

	/**
	 * 
	 * @param criteria
	 * @param filtros
	 * @return
	 */
	Collection<BeneficioOtorgadoEmpresaVO> findReporteTotalBeneficios(
			RepEmpresaVO criteria, List<CondicionConsultaVO> filtros);

	/**
	 * 
	 * @return
	 */
	Collection<ProgramaVO> findProgramasEntregados();

	/**
	 * 
	 * @return
	 */
	Collection<ProgramaVO> findProgramasEntregadosByCriteria(EmpresaVO criteria);

	/**
	 * 
	 * @param codePrograma
	 * @return
	 */
	Collection<SubprogramaVO> findSubprogramasEntregados(Long codePrograma);

	/**
	 * 
	 * @return
	 */
	Collection<ProgramaVO> findProgramasParaEmpresa();

	/**
	 * 
	 * @param codePrograma
	 * @return
	 */
	Collection<SubprogramaVO> findSubprogramasParaEmpresa(Long codePrograma);

	/**
	 * TODO:Metodo para provisional para recuprar los filtros utilizados en el
	 * reporte.
	 * 
	 * @param objRtcVO
	 * @return
	 * 
	 */
	ReporteTotalComunaVO findFiltersComuna(ReporteTotalComunaVO objRtcVO);

	/**
	 * Metodo que consulta para obtener el reporte total empresa por comuna.
	 * 
	 * @param criteria
	 *            ReporteTotalComunaVO. Puede contener los valores para
	 *            delimitar la consulta por: codeComuna: Codigo de la comuna.
	 *            codeSubprograma: Codigo del subprograma. codePrograma: codigo
	 *            del programa. desde: string fecha inicial ('dd/mm/yyyy').
	 *            hasta: String fecha final ('dd/mm/yyyy')
	 * @return
	 * 
	 */
	Collection<ReportComunaVO> findBeneficiosEmpresasComuna(
			ReporteTotalComunaVO criteria,
			Collection<CondicionConsultaVO> filtros);

	/**
	 * 
	 * @param criteria
	 * @return
	 */
	Collection<BeneficioOtorgadoEmpresaVO> findResumenBeneficioOtorgadoDetByCriteria(
			RepEmpresaVO criteria);

	/**
	 * 
	 * @param atributosEspecificos
	 * @param filtros
	 * @param criteria
	 * @return
	 */
	Collection<BeneficioOtorgadoEmpresaVO> findReporteBeneficioOtorgadoDet(
			List<RepAtributoVO> atributosEspecificos,
			List<CondicionConsultaVO> filtros, RepEmpresaVO criteria);

	/**
	 * Retorna una collection<String> con las distintas actividades economicas
	 * registradas en la tabla TCS_EMPRESA.
	 * 
	 * @return
	 */
	Collection<String> findActividadesEconomicas();

	/**
	 * Retorna collection de empresas cuya actividad economica es la indicada en
	 * el parametro.
	 * 
	 * @param actividadEconomica
	 * @return
	 */
	Collection<EmpresaVO> findEmpresasByActividadEconomica(
			String actividadEconomica);

}
